![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 9.10.2007 Skąd: Morąg Ostrzeżenie: (0%) ![]() ![]() |
Czy możliwe jest wykonanie w php aplikacji klient -> serwer?
Mam napisane 2 klasy. Klasa serwer:
Klasa Klient
Problem następuje w momencie kiedy próbuje przesłać zapytanie od klienta do serwera! Nie wyskakują żadne warningi a skrypt serwera jakby sie wieszal w momencie proby odczytu! Tak samo skrypt klienta w momencie wysylania takze sie zawiesza. Prosze o pomoc! |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem dokładnie co może być przyczyną tego zawieszania, bo nie pokazałeś nam najistotniejszego kodu - wywołania metod tych klas. Mogę co najwyżej przypuszczać, że dzieje się coś takiego:
- serwer nasłuchuje - klient łączy się i wysyła powiedzmy 20 bajtów danych - serwer odbiera te 20 bajtów, ale nie wie że to już koniec i czeka na następne - klient w tym czasie czeka na odpowiedź serwera, więc nie zamyka połaczenia - wszystko wisi Wyjścia z tej sytuacji: - Połączenia nieblokujące się, z tym że ty najprawdopodobniej chcesz, żeby serwer sobie działał gdzieś w tle i czekał spokojnie na połączenia. Wtedy coś takiego odpada. No ale poczytać możesz: (socket_set_nonblock" title="Zobacz w manualu PHP" target="_manual, socket_set_block" title="Zobacz w manualu PHP" target="_manual) - Klient po wysłaniu danych nie czeka na odpowiedź tylko od razu zamyka połączenie (też w sumie odpada, bo wyjdzie z tego komunikacja jednostronna) - Po wysłaniu danych wysyłasz jeszcze NULL (0x00). Serwer napotykając NULL kończy odbieranie danych i wysyła odpowiedź (też zakończona NULL-em). Problem jest taki, że NULL nie może wystąpić w przesyłanych danych - I najlepsze: ustalasz sobie jakąś strukturę pakietów przesyłanych między serwerem a klientem, np: Kod Nagłówek - typ_pakietu [1 bajt] - długość_pakietu [4 bajty] Ciało - treść_pakietu [długość_pakietu] Po odczytaniu długości ciała pakietu zarówno serwer jak i klient wiedzą ile jeszcze bajtów danych muszą odebrać. Przydatne funkcje: pack" title="Zobacz w manualu PHP" target="_manual, unpack" title="Zobacz w manualu PHP" target="_manual PS. socket_get_option" title="Zobacz w manualu PHP" target="_manual i socket_set_option" title="Zobacz w manualu PHP" target="_manual też mogą się przydać. Ten post edytował Kicok 25.07.2008, 13:05:28 -------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 9.10.2007 Skąd: Morąg Ostrzeżenie: (0%) ![]() ![]() |
Zmienilem klase Serwer na
Wiec nie dostaje zadnych bledow przy serwerze i kliencie. Jednak kiedy klient wysyla to serwer nie odbiera. Polaczenie jest akceptowane lecz nie ma komunikacji miedzy stronami. Uzywam socket_read i socket_write do przesylania danych. Druga strona to jak mozna zrobic dynamiczny serwer. Ten powyzszy dziala jak mam timeout na 10 to wyglada jakby przez 10 sekund ladowala sie strona. Interesuje mnie klient przychdzi i od razu go widze np. przed uplywem 10 sekund. Ten post edytował gutek84 25.07.2008, 18:11:20 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 04:41 |